Pythonã®éåæã³ã³ããã¹ããããŒãžã£ãŒã®è©³çްãªã¬ã€ããasync withã¹ããŒãã¡ã³ãããªãœãŒã¹ç®¡çææ³ãå¹ççã§ä¿¡é Œæ§ã®é«ãéåæã³ãŒããäœæããããã®ãã¹ããã©ã¯ãã£ã¹ãç¶²çŸ ã
éåæã³ã³ããã¹ããããŒãžã£ãŒïŒAsync withã¹ããŒãã¡ã³ããšãªãœãŒã¹ç®¡ç
éåæããã°ã©ãã³ã°ã¯ãç¹ã«WebãµãŒããŒããããã¯ãŒã¯ã¢ããªã±ãŒã·ã§ã³ãããŒã¿åŠçãã€ãã©ã€ã³ãªã©ã倿°ã®åææäœãåŠçããã¢ããªã±ãŒã·ã§ã³ã«ãããŠãçŸä»£ã®ãœãããŠã§ã¢éçºã§ãŸããŸãéèŠã«ãªã£ãŠããŸããPythonã®asyncio
ã©ã€ãã©ãªã¯ãéåæã³ãŒããäœæããããã®åŒ·åãªãã¬ãŒã ã¯ãŒã¯ãæäŸããéåæã³ã³ããã¹ããããŒãžã£ãŒã¯ãéåæç°å¢ã§ã®ãªãœãŒã¹ã®ç®¡çãšé©åãªã¯ãªãŒã³ã¢ãããä¿èšŒããããã®éèŠãªæ©èœã§ãããã®ã¬ã€ãã§ã¯ãéåæã³ã³ããã¹ããããŒãžã£ãŒã®å
æ¬çãªæŠèŠãæäŸããasync with
ã¹ããŒãã¡ã³ããšå¹æçãªãªãœãŒã¹ç®¡çææ³ã«çŠç¹ãåœãŠãŠããŸãã
ã³ã³ããã¹ããããŒãžã£ãŒã®çè§£
éåæã®åŽé¢ã«å
¥ãåã«ãPythonã®ã³ã³ããã¹ããããŒãžã£ãŒãç°¡åã«åŸ©ç¿ããŸããããã³ã³ããã¹ããããŒãžã£ãŒã¯ãã³ãŒããããã¯ãå®è¡ãããååŸã«å®è¡ãããã»ããã¢ããããã³ç Žæ£ã¢ã¯ã·ã§ã³ãå®çŸ©ãããªããžã§ã¯ãã§ããã³ã³ããã¹ããããŒãžã£ãŒã䜿çšããããã®äž»èŠãªã¡ã«ããºã ã¯ãwith
ã¹ããŒãã¡ã³ãã§ãã
ãã¡ã€ã«ã®ãªãŒãã³ãšã¯ããŒãºã®ç°¡åãªäŸãèããŠã¿ãŸãããã
with open('example.txt', 'r') as f:
data = f.read()
# ããŒã¿ã®åŠç
ãã®äŸã§ã¯ãopen()
颿°ã¯ã³ã³ããã¹ããããŒãžã£ãŒãªããžã§ã¯ããè¿ããŸããwith
ã¹ããŒãã¡ã³ããå®è¡ããããšãã³ã³ããã¹ããããŒãžã£ãŒã®__enter__()
ã¡ãœãããåŒã³åºãããéåžžã¯ã»ããã¢ããæäœïŒãã®å Žåã¯ãã¡ã€ã«ãéãïŒãå®è¡ããŸããwith
ã¹ããŒãã¡ã³ãå
ã®ã³ãŒããããã¯ã®å®è¡ãçµäºããåŸïŒãŸãã¯äŸå€ãçºçããå ŽåïŒãã³ã³ããã¹ããããŒãžã£ãŒã®__exit__()
ã¡ãœãããåŒã³åºãããã³ãŒããæ£åžžã«å®äºãããäŸå€ãçºçãããã«é¢ä¿ãªãããã¡ã€ã«ãé©åã«éããããããã«ããŸãã
éåæã³ã³ããã¹ããããŒãžã£ãŒã®å¿ èŠæ§
åŸæ¥ã®ã³ã³ããã¹ããããŒãžã£ãŒã¯åæåã§ãããã»ããã¢ããæäœãšç Žæ£æäœãå®è¡ãããŠããéãããã°ã©ã ã®å®è¡ããããã¯ããããšãæå³ããŸããéåæç°å¢ã§ã¯ãããããã³ã°æäœã¯ããã©ãŒãã³ã¹ãšå¿çæ§ã«æ·±å»ãªåœ±é¿ãäžããå¯èœæ§ããããŸããããã§ãéåæã³ã³ããã¹ããããŒãžã£ãŒãç»å ŽããŸããããã«ãããã€ãã³ãã«ãŒãããããã¯ããã«éåæã®ã»ããã¢ããæäœãšç Žæ£æäœãå®è¡ã§ãããããããå¹ççã§ã¹ã±ãŒã©ãã«ãªéåæã¢ããªã±ãŒã·ã§ã³ãå¯èœã«ãªããŸãã
ããšãã°ãæäœãå®è¡ããåã«ããŒã¿ããŒã¹ããããã¯ãååŸããå¿ èŠãããã·ããªãªãèããŠã¿ãŸããããããã¯ã®ååŸãããããã³ã°æäœã§ããå Žåãã¢ããªã±ãŒã·ã§ã³å šäœã忢ããå¯èœæ§ããããŸããéåæã³ã³ããã¹ããããŒãžã£ãŒã䜿çšãããšãããã¯ãéåæçã«ååŸã§ãããããã¢ããªã±ãŒã·ã§ã³ãå¿çããªããªãã®ãé²ãããšãã§ããŸãã
éåæã³ã³ããã¹ããããŒãžã£ãŒãšasync with
ã¹ããŒãã¡ã³ã
éåæã³ã³ããã¹ããããŒãžã£ãŒã¯ã__aenter__()
ã¡ãœãããš__aexit__()
ã¡ãœããã䜿çšããŠå®è£
ãããŸãããããã®ã¡ãœããã¯éåæã³ã«ãŒãã³ã§ãããawait
ããŒã¯ãŒãã䜿çšããŠåŸ
æ©ã§ããããšãæå³ããŸããasync with
ã¹ããŒãã¡ã³ãã¯ãéåæã³ã³ããã¹ããããŒãžã£ãŒã®ã³ã³ããã¹ãå
ã§ã³ãŒããå®è¡ããããã«äœ¿çšãããŸãã
åºæ¬çãªæ§æã¯æ¬¡ã®ãšããã§ãã
async with AsyncContextManager() as resource:
# ãªãœãŒã¹ã䜿çšããŠéåææäœãå®è¡ããŸã
AsyncContextManager()
ãªããžã§ã¯ãã¯ã__aenter__()
ã¡ãœãããš__aexit__()
ã¡ãœãããå®è£
ããã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã§ããasync with
ã¹ããŒãã¡ã³ããå®è¡ããããšã__aenter__()
ã¡ãœãããåŒã³åºããããã®çµæãresource
倿°ã«å²ãåœãŠãããŸããasync with
ã¹ããŒãã¡ã³ãå
ã®ã³ãŒããããã¯ã®å®è¡ãçµäºãããšã__aexit__()
ã¡ãœãããåŒã³åºãããé©åãªã¯ãªãŒã³ã¢ãããä¿èšŒãããŸãã
éåæã³ã³ããã¹ããããŒãžã£ãŒã®å®è£
éåæã³ã³ããã¹ããããŒãžã£ãŒãäœæããã«ã¯ã__aenter__()
ã¡ãœãããš__aexit__()
ã¡ãœãããæã€ã¯ã©ã¹ãå®çŸ©ããå¿
èŠããããŸãã__aenter__()
ã¡ãœããã¯ã»ããã¢ããæäœãå®è¡ãã__aexit__()
ã¡ãœããã¯ç Žæ£æäœãå®è¡ããå¿
èŠããããŸããäž¡æ¹ã®ã¡ãœããã¯ãasync
ããŒã¯ãŒãã䜿çšããŠéåæã³ã«ãŒãã³ãšããŠå®çŸ©ããå¿
èŠããããŸãã
仮説ã®ãµãŒãã¹ãžã®éåææ¥ç¶ã管çããéåæã³ã³ããã¹ããããŒãžã£ãŒã®ç°¡åãªäŸã次ã«ç€ºããŸãã
import asyncio
class AsyncConnection:
async def __aenter__(self):
self.conn = await self.connect()
return self.conn
async def __aexit__(self, exc_type, exc, tb):
await self.conn.close()
async def connect(self):
# éåææ¥ç¶ãã·ãã¥ã¬ãŒããã
print("Connecting...")
await asyncio.sleep(1) # ãããã¯ãŒã¯ã®é
å»¶ãã·ãã¥ã¬ãŒããã
print("Connected!")
return self
async def close(self):
# æ¥ç¶ãéããã·ãã¥ã¬ãŒããã
print("Closing connection...")
await asyncio.sleep(0.5) # éããé
å»¶ãã·ãã¥ã¬ãŒããã
print("Connection closed.")
async def main():
async with AsyncConnection() as conn:
print("Performing operations with the connection...")
await asyncio.sleep(2)
print("Operations complete.")
if __name__ == "__main__":
asyncio.run(main())
ãã®äŸã§ã¯ãAsyncConnection
ã¯ã©ã¹ã¯__aenter__()
ã¡ãœãããš__aexit__()
ã¡ãœãããå®çŸ©ããŸãã__aenter__()
ã¡ãœããã¯éåææ¥ç¶ã確ç«ããæ¥ç¶ãªããžã§ã¯ããè¿ããŸãã__aexit__()
ã¡ãœããã¯ãasync with
ãããã¯ãçµäºãããšãã«æ¥ç¶ãéããŸãã
__aexit__()
ã§ã®äŸå€ã®åŠç
__aexit__()
ã¡ãœããã¯ãexc_type
ãexc
ãããã³tb
ã®3ã€ã®åŒæ°ãåãåããŸãããããã®åŒæ°ã«ã¯ãasync with
ãããã¯å
ã§çºçããäŸå€ã«é¢ããæ
å ±ãå«ãŸããŠããŸããäŸå€ãçºçããªãã£ãå Žåã3ã€ã®åŒæ°ã¯ãã¹ãŠNone
ã«ãªããŸãã
ãããã®åŒæ°ã䜿çšããŠãäŸå€ãåŠçããæœåšçã«æå¶ããããšãã§ããŸãã__aexit__()
ãTrue
ãè¿ããšãäŸå€ã¯æå¶ãããåŒã³åºãå
ã«äŒæãããŸããã__aexit__()
ãNone
ïŒãŸãã¯False
ãšè©äŸ¡ããããã®ä»ã®å€ïŒãè¿ããšãäŸå€ãå床çºçããŸãã
__aexit__()
ã§äŸå€ãåŠçããäŸã次ã«ç€ºããŸãã
class AsyncConnection:
async def __aexit__(self, exc_type, exc, tb):
if exc_type is not None:
print(f"An exception occurred: {exc_type.__name__}: {exc}")
# ã¯ãªãŒã³ã¢ãããŸãã¯ãã®ã³ã°ãå®è¡ããŸã
# ãªãã·ã§ã³ã§ãTrueãè¿ãããšã§äŸå€ãæå¶ããŸã
return True # äŸå€ãæå¶ããŸã
else:
await self.conn.close()
ãã®äŸã§ã¯ã__aexit__()
ã¡ãœããã¯äŸå€ãçºçãããã©ããã確èªããŸããçºçããå Žåããšã©ãŒã¡ãã»ãŒãžãåºåããã¯ãªãŒã³ã¢ãããå®è¡ããŸããTrue
ãè¿ãããšã§ãäŸå€ã¯æå¶ãããå床çºçããããšããªããªããŸãã
éåæã³ã³ããã¹ããããŒãžã£ãŒã«ãããªãœãŒã¹ç®¡ç
éåæã³ã³ããã¹ããããŒãžã£ãŒã¯ãéåæç°å¢ã§ã®ãªãœãŒã¹ç®¡çã«ç¹ã«åœ¹ç«ã¡ãŸããã³ãŒããããã¯ãå®è¡ãããåã«ãªãœãŒã¹ãååŸãããã®åŸã§è§£æŸããããã®ã¯ãªãŒã³ã§ä¿¡é Œæ§ã®é«ãæ¹æ³ãæäŸããäŸå€ãçºçããå Žåã§ãããªãœãŒã¹ãé©åã«ã¯ãªãŒã³ã¢ãããããããã«ããŸãã
éåæã³ã³ããã¹ããããŒãžã£ãŒã®ãªãœãŒã¹ç®¡çã®äžè¬çãªãŠãŒã¹ã±ãŒã¹ã次ã«ç€ºããŸãã
- ããŒã¿ããŒã¹æ¥ç¶ïŒããŒã¿ããŒã¹ãžã®éåææ¥ç¶ã®ç®¡çã
- ãããã¯ãŒã¯æ¥ç¶ïŒãœã±ãããHTTPã¯ã©ã€ã¢ã³ããªã©ã®éåæãããã¯ãŒã¯æ¥ç¶ã®åŠçã
- ããã¯ãšã»ããã©ïŒå ±æãªãœãŒã¹ãžã®ã¢ã¯ã»ã¹ãåæããããã«ãéåæããã¯ãšã»ããã©ãååŸããã³è§£æŸããŸãã
- ãã¡ã€ã«åŠçïŒéåæãã¡ã€ã«æäœã®ç®¡çã
- ãã©ã³ã¶ã¯ã·ã§ã³ç®¡çïŒéåæãã©ã³ã¶ã¯ã·ã§ã³ç®¡çã®å®è£ ã
äŸïŒéåæããã¯ç®¡ç
éåæç°å¢ã§å ±æãªãœãŒã¹ãžã®ã¢ã¯ã»ã¹ãåæããå¿ èŠãããã·ããªãªãèããŠã¿ãŸããããéåæããã¯ã䜿çšããŠãäžåºŠã«1ã€ã®ã³ã«ãŒãã³ã®ã¿ããªãœãŒã¹ã«ã¢ã¯ã»ã¹ã§ããããã«ããããšãã§ããŸãã
éåæã³ã³ããã¹ããããŒãžã£ãŒã§éåæããã¯ã䜿çšããäŸã次ã«ç€ºããŸãã
import asyncio
async def main():
lock = asyncio.Lock()
async def worker(name):
async with lock:
print(f"{name}: Acquired lock.")
await asyncio.sleep(1)
print(f"{name}: Released lock.")
tasks = [asyncio.create_task(worker(f"Worker {i}")) for i in range(3)]
await asyncio.gather(*tasks)
if __name__ == "__main__":
asyncio.run(main())
ãã®äŸã§ã¯ãasyncio.Lock()
ãªããžã§ã¯ãã¯éåæã³ã³ããã¹ããããŒãžã£ãŒãšããŠäœ¿çšãããŸããasync with lock:
ã¹ããŒãã¡ã³ãã¯ãã³ãŒããããã¯ãå®è¡ãããåã«ããã¯ãååŸãããã®åŸã§è§£æŸããŸããããã«ãããäžåºŠã«1ã€ã®ã¯ãŒã«ãŒã®ã¿ãå
±æãªãœãŒã¹ïŒãã®å Žåã¯ãã³ã³ãœãŒã«ãžã®å°å·ïŒã«ã¢ã¯ã»ã¹ã§ããããã«ãªããŸãã
äŸïŒéåæããŒã¿ããŒã¹æ¥ç¶ç®¡ç
å€ãã®ææ°ããŒã¿ããŒã¹ã¯éåæãã©ã€ããŒãæäŸããŠããŸãããããã®æ¥ç¶ã广çã«ç®¡çããããšã¯éèŠã§ããæ¶ç©ºã®asyncpg
ã©ã€ãã©ãªïŒå®éã®ãã®ãšåæ§ïŒã䜿çšããæŠå¿µçãªäŸã次ã«ç€ºããŸãã
import asyncio
# asyncpgã©ã€ãã©ãªãæ³å®ïŒæ¶ç©ºïŒ
import asyncpg
class AsyncDatabaseConnection:
def __init__(self, dsn):
self.dsn = dsn
self.conn = None
async def __aenter__(self):
try:
self.conn = await asyncpg.connect(self.dsn)
return self.conn
except Exception as e:
print(f"Error connecting to database: {e}")
raise
async def __aexit__(self, exc_type, exc, tb):
if self.conn:
await self.conn.close()
print("Database connection closed.")
async def main():
dsn = "postgresql://user:password@host:port/database"
async with AsyncDatabaseConnection(dsn) as db_conn:
try:
# ããŒã¿ããŒã¹æäœãå®è¡ããŸã
rows = await db_conn.fetch('SELECT * FROM my_table')
for row in rows:
print(row)
except Exception as e:
print(f"Error during database operation: {e}")
if __name__ == "__main__":
asyncio.run(main())
éèŠãªæ³šæïŒ `asyncpg.connect`ããã³`db_conn.fetch`ãã䜿çšããŠããç¹å®ã®éåæããŒã¿ããŒã¹ãã©ã€ããŒããã®å®éã®åŒã³åºãã«çœ®ãæããŠãã ããïŒäŸïŒPostgreSQLã®å Žåã¯`aiopg`ãMongoDBã®å Žåã¯`motor`ãªã©ïŒãããŒã¿ãœãŒã¹åïŒDSNïŒã¯ããŒã¿ããŒã¹ã«ãã£ãŠç°ãªããŸãã
éåæã³ã³ããã¹ããããŒãžã£ãŒã䜿çšããããã®ãã¹ããã©ã¯ãã£ã¹
éåæã³ã³ããã¹ããããŒãžã£ãŒã广çã«äœ¿çšããã«ã¯ã次ã®ãã¹ããã©ã¯ãã£ã¹ãæ€èšããŠãã ããã
__aenter__()
ãš__aexit__()
ãã·ã³ãã«ã«ä¿ã€ïŒãããã®ã¡ãœããã§è€éãŸãã¯é·æéå®è¡ãããæäœãå®è¡ããªãã§ãã ãããã»ããã¢ããã¿ã¹ã¯ãšç Žæ£ã¿ã¹ã¯ã«éäžããŠãã ããã- äŸå€ãæ³šææ·±ãåŠçããïŒ
__aexit__()
ã¡ãœãããäŸå€ãé©åã«åŠçããäŸå€ãçºçããå Žåã§ãå¿ èŠãªã¯ãªãŒã³ã¢ãããå®è¡ããããšã確èªããŠãã ããã - ããããã³ã°æäœãåé¿ããïŒ
__aenter__()
ãŸãã¯__aexit__()
ã§ããããã³ã°æäœãå®è¡ããªãã§ãã ãããå¯èœãªå Žåã¯åžžã«éåæã®ä»£æ¿ææ®µã䜿çšããŠãã ããã - éåæã©ã€ãã©ãªã䜿çšããïŒã³ã³ããã¹ããããŒãžã£ãŒå ã®ãã¹ãŠã®I/Oæäœã«éåæã©ã€ãã©ãªã䜿çšããŠããããšã確èªããŠãã ããã
- 培åºçã«ãã¹ãããïŒéåæã³ã³ããã¹ããããŒãžã£ãŒã培åºçã«ãã¹ãããŠããšã©ãŒã·ããªãªãå«ããããŸããŸãªæ¡ä»¶äžã§æ£ããæ©èœããããšã確èªããŠãã ããã
- ã¿ã€ã ã¢ãŠããæ€èšããïŒãããã¯ãŒã¯é¢é£ã®ã³ã³ããã¹ããããŒãžã£ãŒïŒããŒã¿ããŒã¹ãŸãã¯APIæ¥ç¶ãªã©ïŒã®å Žåã¯ãæ¥ç¶ã倱æããå Žåã«ç¡æéã®ãããã¯ãé²ãããã«ãã¿ã€ã ã¢ãŠããå®è£ ããŸãã
é«åºŠãªãããã¯ãšãŠãŒã¹ã±ãŒã¹
éåæã³ã³ããã¹ããããŒãžã£ãŒã®ãã¹ã
éåæã³ã³ããã¹ããããŒãžã£ãŒããã¹ãããŠãè€æ°ã®ãªãœãŒã¹ãåæã«ç®¡çã§ããŸããããã¯ãåãã³ãŒããããã¯å ã§è€æ°ã®ããã¯ãååŸããããè€æ°ã®ãµãŒãã¹ã«æ¥ç¶ãããããå¿ èŠãããå Žåã«åœ¹ç«ã¡ãŸãã
async def main():
lock1 = asyncio.Lock()
lock2 = asyncio.Lock()
async with lock1:
async with lock2:
print("Acquired both locks.")
await asyncio.sleep(1)
print("Releasing locks.")
if __name__ == "__main__":
asyncio.run(main())
åå©çšå¯èœãªéåæã³ã³ããã¹ããããŒãžã£ãŒã®äœæ
åå©çšå¯èœãªéåæã³ã³ããã¹ããããŒãžã£ãŒãäœæããŠãäžè¬çãªãªãœãŒã¹ç®¡çãã¿ãŒã³ãã«ãã»ã«åã§ããŸããããã¯ãã³ãŒãã®éè€ãæžãããä¿å®æ§ãåäžãããã®ã«åœ¹ç«ã¡ãŸãã
ããšãã°ã倱æããæäœãèªåçã«å詊è¡ããéåæã³ã³ããã¹ããããŒãžã£ãŒãäœæã§ããŸãã
import asyncio
class RetryAsyncContextManager:
def __init__(self, operation, max_retries=3, delay=1):
self.operation = operation
self.max_retries = max_retries
self.delay = delay
async def __aenter__(self):
for i in range(self.max_retries):
try:
return await self.operation()
except Exception as e:
print(f"Attempt {i + 1} failed: {e}")
if i == self.max_retries - 1:
raise
await asyncio.sleep(self.delay)
return None # ããã«å°éããããšã¯ãªãã¯ãã§ã
async def __aexit__(self, exc_type, exc, tb):
pass # ã¯ãªãŒã³ã¢ããã¯äžèŠ
async def my_operation():
# 倱æããå¯èœæ§ã®ããæäœãã·ãã¥ã¬ãŒããã
import random
if random.random() < 0.5:
raise Exception("Operation failed!")
else:
return "Operation succeeded!"
async def main():
import random
async with RetryAsyncContextManager(my_operation) as result:
print(f"Result: {result}")
if __name__ == "__main__":
asyncio.run(main())
ãã®äŸã¯ãå ç¢ãªã³ã³ããã¹ããããŒãžã£ãŒã®åºç€ãšãªãããšã©ãŒåŠçãå詊è¡ããžãã¯ãããã³åå©çšæ§ã瀺ããŠããŸãã
éåæã³ã³ããã¹ããããŒãžã£ãŒãšãžã§ãã¬ãŒã¿ãŒ
äžè¬çã§ã¯ãããŸããããéåæã³ã³ããã¹ããããŒãžã£ãŒãšéåæãžã§ãã¬ãŒã¿ãŒãçµã¿åãããŠã匷åãªããŒã¿åŠçãã€ãã©ã€ã³ãäœæããããšãã§ããŸããããã«ãããé©åãªãªãœãŒã¹ç®¡çãä¿èšŒããªãããéåæçã«ããŒã¿ãåŠçããããšãã§ããŸãã
å®éã®äŸãšãŠãŒã¹ã±ãŒã¹
éåæã³ã³ããã¹ããããŒãžã£ãŒã¯ãããŸããŸãªå®éã®ã·ããªãªã«é©çšã§ããŸããããã€ãã®èåãªäŸã次ã«ç€ºããŸãã
- Webãã¬ãŒã ã¯ãŒã¯ïŒ FastAPIãSanicãªã©ã®ãã¬ãŒã ã¯ãŒã¯ã¯ãéåææäœã«å€§ããäŸåããŠããŸããããŒã¿ããŒã¹æ¥ç¶ãAPIåŒã³åºãããã®ä»ã®I/OããŠã³ãã¿ã¹ã¯ã¯ãåæå®è¡æ§ãšå¿çæ§ãæå€§åããããã«ãéåæã³ã³ããã¹ããããŒãžã£ãŒã䜿çšããŠç®¡çãããŸãã
- ã¡ãã»ãŒãžãã¥ãŒïŒã¡ãã»ãŒãžãã¥ãŒïŒäŸïŒRabbitMQãKafkaïŒãšã®å¯Ÿè©±ã«ã¯ãéåææ¥ç¶ã®ç¢ºç«ãšç¶æã䌎ãããšããããããŸããéåæã³ã³ããã¹ããããŒãžã£ãŒã¯ããšã©ãŒãçºçããå Žåã§ããæ¥ç¶ãé©åã«éããããããã«ããŸãã
- ã¯ã©ãŠããµãŒãã¹ïŒã¯ã©ãŠããµãŒãã¹ïŒäŸïŒAWS S3ãAzure Blob StorageïŒãžã®ã¢ã¯ã»ã¹ã«ã¯ãéåžžãéåæAPIåŒã³åºãã䌎ããŸããã³ã³ããã¹ããããŒãžã£ãŒã¯ãèªèšŒããŒã¯ã³ãæ¥ç¶ããŒãªã³ã°ãããã³ãšã©ãŒåŠçãå ç¢ãªæ¹æ³ã§ç®¡çã§ããŸãã
- IoTã¢ããªã±ãŒã·ã§ã³ïŒ IoTããã€ã¹ã¯ãéåæãããã³ã«ã䜿çšããŠäžå€®ãµãŒããŒãšéä¿¡ããããšããããããŸããã³ã³ããã¹ããããŒãžã£ãŒã¯ãããã€ã¹æ¥ç¶ãã»ã³ãµãŒããŒã¿ã¹ããªãŒã ãããã³ã³ãã³ãå®è¡ãä¿¡é Œæ§ãé«ãã¹ã±ãŒã©ãã«ãªæ¹æ³ã§ç®¡çã§ããŸãã
- ãã€ããã©ãŒãã³ã¹ã³ã³ãã¥ãŒãã£ã³ã°ïŒ HPCç°å¢ã§ã¯ãéåæã³ã³ããã¹ããããŒãžã£ãŒã䜿çšããŠã忣ãªãœãŒã¹ã䞊åèšç®ãããã³ããŒã¿è»¢éãå¹ççã«ç®¡çã§ããŸãã
éåæã³ã³ããã¹ããããŒãžã£ãŒã®ä»£æ¿ææ®µ
éåæã³ã³ããã¹ããããŒãžã£ãŒã¯ãªãœãŒã¹ç®¡çã®ããã®åŒ·åãªããŒã«ã§ãããç¹å®ã®ç¶æ³ã§äœ¿çšã§ãã代æ¿ã¢ãããŒãããããŸãã
try...finally
ãããã¯ïŒäŸå€ãçºçãããã©ããã«é¢ä¿ãªãããªãœãŒã¹ãè§£æŸãããããã«ãtry...finally
ãããã¯ã䜿çšã§ããŸãããã ãããã®ã¢ãããŒãã¯ãéåæã³ã³ããã¹ããããŒãžã£ãŒã䜿çšãããããåé·ã§èªã¿ã«ãããªãå¯èœæ§ããããŸãã- éåæãªãœãŒã¹ããŒã«ïŒé »ç¹ã«ååŸããã³è§£æŸããããªãœãŒã¹ã®å Žåã¯ãéåæãªãœãŒã¹ããŒã«ã䜿çšããŠããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸãããªãœãŒã¹ããŒã«ã¯ãäºåã«å²ãåœãŠããããªãœãŒã¹ã®ããŒã«ãç¶æããããããè¿ éã«ååŸããã³è§£æŸã§ããŸãã
- æåãªãœãŒã¹ç®¡çïŒå Žåã«ãã£ãŠã¯ãã«ã¹ã¿ã ã³ãŒãã䜿çšããŠãªãœãŒã¹ãæåã§ç®¡çããå¿ èŠãããå ŽåããããŸãããã ãããã®ã¢ãããŒãã¯ãšã©ãŒãçºçãããããä¿å®ãå°é£ã«ãªãå¯èœæ§ããããŸãã
ã©ã®ã¢ãããŒãã䜿çšãããã¯ãã¢ããªã±ãŒã·ã§ã³ã®ç¹å®ã®èŠä»¶ã«ãã£ãŠç°ãªããŸããéåæã³ã³ããã¹ããããŒãžã£ãŒã¯ãéåæç°å¢ã§ãªãœãŒã¹ã管çããããã®ã¯ãªãŒã³ã§ä¿¡é Œæ§ãé«ãå¹ççãªæ¹æ³ãæäŸãããããéåžžãã»ãšãã©ã®ãªãœãŒã¹ç®¡çã·ããªãªã§æšå¥šãããéžæè¢ã§ãã
çµè«
éåæã³ã³ããã¹ããããŒãžã£ãŒã¯ãPythonã§å¹ççã§ä¿¡é Œæ§ã®é«ãéåæã³ãŒããäœæããããã®è²ŽéãªããŒã«ã§ããasync with
ã¹ããŒãã¡ã³ãã䜿çšãã__aenter__()
ã¡ãœãããš__aexit__()
ã¡ãœãããå®è£
ããããšã§ãéåæç°å¢ã§ãªãœãŒã¹ã广çã«ç®¡çããé©åãªã¯ãªãŒã³ã¢ãããä¿èšŒã§ããŸãããã®ã¬ã€ãã§ã¯ãéåæã³ã³ããã¹ããããŒãžã£ãŒã®å
æ¬çãªæŠèŠãæäŸããæ§æãå®è£
ããã¹ããã©ã¯ãã£ã¹ãããã³å®éã®ãŠãŒã¹ã±ãŒã¹ã«ã€ããŠèª¬æããŸããããã®ã¬ã€ãã§æŠèª¬ãããŠããã¬ã€ãã©ã€ã³ã«åŸãããšã§ãéåæã³ã³ããã¹ããããŒãžã£ãŒã掻çšããŠãããå
ç¢ã§ã¹ã±ãŒã©ãã«ã§ä¿å®å¯èœãªéåæã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸãããããã®ãã¿ãŒã³ãæ¡çšãããšãããã¯ãªãŒã³ã§ãããPythonicã§ãããå¹ççãªéåæã³ãŒãã«ã€ãªãããŸããéåææäœã¯ãçŸä»£ã®ãœãããŠã§ã¢ã§ãŸããŸãéèŠã«ãªã£ãŠãããéåæã³ã³ããã¹ããããŒãžã£ãŒãç¿åŸããããšã¯ãçŸä»£ã®ãœãããŠã§ã¢ãšã³ãžãã¢ã«ãšã£ãŠäžå¯æ¬ ãªã¹ãã«ã§ãã